package com.autoerp.action.cliente;

import java.util.List;

import org.mentawai.core.BaseAction;

import com.autoerp.dao.cliente.ClienteDAO;
import com.autoerp.model.administracao.CidadeEntity;
import com.autoerp.model.cliente.ClienteEntity;

/**
 * Classe representa a ação do modulo Cliente.
 */
public class ClienteAction extends BaseAction {

	private final ClienteDAO clienteDAO;

	public ClienteAction(ClienteDAO clienteDAO) {
		this.clienteDAO = clienteDAO;
	}

	/**
	 * Action Adicionar Cliente.
	 * 
	 * @return the string
	 */
	public String adicionar() {

		if (!isPost()) {

			// Retorna a String ERROR.
			return ERROR;

		} else {

			// Obter da entrada o identificador da cidade
			int id_cidade = input.getInt("id_cidade");

			// Instanciar o objeto cidade
			CidadeEntity cidade = new CidadeEntity();

			// Setar o identificador cidade
			cidade.setId_cidade(id_cidade);

			// Obter da entrada o objeto cliente
			ClienteEntity cliente = input.getObject(ClienteEntity.class);

			// Setar a cidade no objeto cliente
			cliente.setCidade(cidade);

			// Salvar o cliente no BD
			clienteDAO.salvar(cliente);

			// Seta o objeto cliente na saida da action
			output.setObject(cliente);
			
			

			return CREATED;

		}

	}

	/**
	 * Action Buscar Cliente.
	 * 
	 * @return the string
	 */
	public String buscar() {

		if (!isPost()) {
			// Retorna a String ERROR.
			return ERROR;

		} else {
			// Obter da entrada o identificador da opcao escolhida
			int id_busca = input.getInt("id_busca");

			// Obter da entrada o texto a ser buscado
			String de_busca = input.getString("de_busca");

			// Instanciar o objeto cliente
			ClienteEntity cliente = new ClienteEntity();

			// Instanciar lista de objeto cliente
			List<ClienteEntity> listaClientes = clienteDAO
					.buscarCliente(cliente);
			;

			// Fazer a busca pela opcao escolhida
			switch (id_busca) {

			// Buscar por nome
			case 01:

				// Setar nome buscado no objeto cliente
				cliente.setDe_nome(de_busca);

				// Busca cliente no BD
				listaClientes = clienteDAO.buscarCliente(cliente);

				// Se a lista de clientes for null ou vazia retorna null
				if (listaClientes == null || listaClientes.isEmpty()) {

					addMessage("Cliente não encontrado!");
					return ERROR;

				} else {
					// Setar clientes no output da action
					output.setValue("listaClientes", listaClientes);
					return SUCCESS;
				}

				// Buscar por ID
			case 02:

				// Setar id buscado no objeto cliente
				cliente.setId_cliente(Integer.parseInt(de_busca));

				// Busca cliente no BD
				listaClientes = clienteDAO.buscarCliente(cliente);

				// Se a lista de clientes for null ou vazia retorna null
				if (listaClientes == null || listaClientes.isEmpty()) {

					addMessage("Cliente não encontrado!");
					return ERROR;

				} else {
					// Setar clientes no output da action
					output.setValue("listaClientes", listaClientes);
					
				
					
					return SUCCESS;

				}

			default:
				return ERROR;

			}

		}

	}

	/**
	 * Action Editar Cliente.
	 * 
	 * @return the string
	 */
	public String editar() {

		if (!isPost()) {

			// Obter da entrada o identificador do cliente
			int id_cliente = input.getInt("id_cliente");

			// Buscar cliente no BD
			ClienteEntity cliente = clienteDAO.buscarPorId(id_cliente);

			// Setar cliente na output da action
			output.setObject(cliente);

			return SHOW;

		} else {

			// Obter da entrada o identificador do cliente
			int id = input.getInt("id_cliente");

			// Buscar cliente no BD
			ClienteEntity clienteNovo = clienteDAO.buscarPorId(id);

			input.inject(clienteNovo); // BlacklistParamFilter should be used
										// here
										// to project against malicious param
										// injection (see AppManager)
			// Update do cliente no BD
			clienteDAO.update(clienteNovo);

			replaceSessionObj(clienteNovo);

			addMessage("edit_ok");

			return UPDATED;
		}

	}

	/**
	 * Action Listar Clientes.
	 * 
	 * @return the string
	 */
	public String listar() {
		// Instanciar lista de objeto cliente
		List<ClienteEntity> listaClientes = clienteDAO.buscarListaClientes();
		
		// Setar lista clientes no output da action
		output.setValue("listaClientes", listaClientes);
		
		return SUCCESS;

		
	}

}
